package com.malou.client.graficosestadisticos;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.extjs.gxt.charts.client.Chart;
import com.extjs.gxt.charts.client.event.ChartEvent;
import com.extjs.gxt.charts.client.event.ChartListener;
import com.extjs.gxt.charts.client.model.BarDataProvider;
import com.extjs.gxt.charts.client.model.ChartModel;
import com.extjs.gxt.charts.client.model.Legend;
import com.extjs.gxt.charts.client.model.Legend.Position;
import com.extjs.gxt.charts.client.model.ScaleProvider;
import com.extjs.gxt.charts.client.model.charts.BarChart;
import com.extjs.gxt.charts.client.model.charts.BarChart.BarStyle;
import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.Style.LayoutRegion;
import com.extjs.gxt.ui.client.Style.SelectionMode;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.StoreEvent;
import com.extjs.gxt.ui.client.store.StoreListener;
import com.extjs.gxt.ui.client.util.IconHelper;
import com.extjs.gxt.ui.client.util.Margins;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Label;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.Status;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.form.DateField;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.FormPanel.LabelAlign;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel;
import com.extjs.gxt.ui.client.widget.grid.RowNumberer;
import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
import com.extjs.gxt.ui.client.widget.layout.ColumnData;
import com.extjs.gxt.ui.client.widget.layout.ColumnLayout;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.malou.client.MalouConstants;
import com.malou.client.ventas.modeloprenda.ModeloPrendas;
import com.malou.client.ventas.tienda.Tiendas;

public class PrendasVendidasGraficosPanel extends ContentPanel{

	private MalouConstants constants = GWT.create(MalouConstants.class);
	private final Chart chart = new Chart("gxt/chart/open-flash-chart.swf");
	Grid<BeanModel> detalle;
	DateField desde;
	DateField hasta;
	Button find;
	Status status;
	PrendasVendidasGraficosPanel singleton;
	public ComboBox<BeanModel> tienda;
	Label tiendaL;	
	private TextField<String> codigo;
	private ComboBox<BeanModel> marca;
	private ComboBox<BeanModel> modeloprenda; 
	private ComboBox<BeanModel> tela;	
	private ComboBox<BeanModel> disenio;	
	private ComboBox<BeanModel> color;	
	private ComboBox<BeanModel> talla;	
	private ComboBox<BeanModel> tipoprenda;	
	FormPanel detalleFilter;
	
	public PrendasVendidasGraficosPanel(){
		singleton = this;
		setFrame(true);
        setCollapsible(true);
        setAnimCollapse(false);  
        
        setIcon(IconHelper.createPath("images/icons/table.png"));  
        setHeading(constants.graficosDetallePrendasVendidas());
        
        setLayout(new BorderLayout());
        
        BorderLayoutData northData = new BorderLayoutData(LayoutRegion.NORTH, 120);  
        northData.setSplit(true);
        northData.setMargins(new Margins(0, 0, 3, 0));
        
        Tiendas.getComboTienda();
        
        tienda = new ComboBox<BeanModel>();       
	    tienda.setEditable(false);	    
	    tienda.setDisplayField("nombre");	    	    
	    tienda.setWidth(150);  
	    tienda.setStore(Tiendas.storeCombo);  
	    tienda.setTypeAhead(true);  
	    tienda.setTriggerAction(TriggerAction.ALL);
	    tienda.setValueField("nombre");
	    tienda.setUseQueryCache(false);
	    tienda.setAllowBlank(true);	    
	    
	    ToolBar toolBar = new ToolBar();
	    
	    tiendaL = new Label(constants.graficosTienda());
	    toolBar.add(tiendaL);
	    toolBar.add(tienda);
	    
        desde = new DateField();
        desde.getPropertyEditor().setFormat(DateTimeFormat.getFormat("yyyy-MM-dd"));
        desde.setAllowBlank(false);
        desde.setValue(new Date());
        desde.setMaxValue(new Date());        
        
  
        Label desdeL = new Label(constants.graficosdesde());        
        
        toolBar.add(desdeL);
        toolBar.add(desde);    
        
        hasta = new DateField();
        hasta.getPropertyEditor().setFormat(DateTimeFormat.getFormat("yyyy-MM-dd"));
        hasta.setAllowBlank(false);
        hasta.setValue(new Date());
        hasta.setMaxValue(new Date());
        
        Label hastaL = new Label(constants.graficoshasta());
        
        toolBar.add(hastaL);
        toolBar.add(hasta);
        
        status = new Status();
	    status.setBusy(constants.cargando());
	    status.hide();    
	    status.setAutoWidth(true);
	    status.setStyleAttribute("paddingLeft", "20px");
	    toolBar.add(status);
	    
	    find = new Button(constants.find(), IconHelper.createPath("images/icons/find.png"));
        find.setStyleAttribute("paddingLeft", "20px");
        
        SelectionListener<ButtonEvent> sl_find;        
        sl_find = new SelectionListener<ButtonEvent>(){
        	
        	@Override
			public void componentSelected(ButtonEvent ce) {		
				if(validate()){
					buscar();				
				}
			}
        };
        find.addSelectionListener(sl_find);
        
        toolBar.add(find);
	    
	    setTopComponent(toolBar);
	   
	    FormData formData = new FormData("100%");  
        detalleFilter = new FormPanel();
	    detalleFilter.setHeaderVisible(false);
	    detalleFilter.setFrame(true);
	    
	    //detalleFilter.setSize(600, -1);  
	    detalleFilter.setLabelAlign(LabelAlign.TOP);  
		    
	    LayoutContainer main = new LayoutContainer();  
	    main.setLayout(new ColumnLayout());
	 
	    LayoutContainer left = new LayoutContainer();  
	    left.setStyleAttribute("paddingRight", "10px");  
	    FormLayout layout = new FormLayout();  
	    layout.setLabelAlign(LabelAlign.TOP);  
	    left.setLayout(layout);
	    
	    LayoutContainer cent1 = new LayoutContainer();
	    cent1.setStyleAttribute("paddingCenter","10px");
	    layout = new FormLayout();
	    layout.setLabelAlign(LabelAlign.TOP);
	    cent1.setLayout(layout);
	 
	    LayoutContainer cent2 = new LayoutContainer();
	    cent2.setStyleAttribute("paddingCenter","10px");
	    layout = new FormLayout();
	    layout.setLabelAlign(LabelAlign.TOP);
	    cent2.setLayout(layout);
	    
	    LayoutContainer right = new LayoutContainer();  
	    right.setStyleAttribute("paddingLeft", "10px");  
	    layout = new FormLayout();  
	    layout.setLabelAlign(LabelAlign.TOP);  
	    right.setLayout(layout);  
	
	    codigo = new TextField<String>();
	
		ModeloPrendas.getComboMarcas();
		ModeloPrendas.loaderMarca.load();
		
	    marca = new ComboBox<BeanModel>();
	    marca.setDisplayField("descripcion");
	    marca.setStore(ModeloPrendas.storeMarca);
	    marca.setTypeAhead(true);  
	    marca.setEmptyText("Seleccione...");
	    marca.setTriggerAction(TriggerAction.ALL);
	    marca.setValueField("descripcion");
	    marca.setUseQueryCache(false);
	    marca.setAllowBlank(true);
	    //marca.setValue(marca.getStore().getAt(0));
	    marca.setMinChars(0);
	    marca.getStore().addStoreListener(new StoreListener<BeanModel>(){
	    	public void storeDataChanged(StoreEvent<BeanModel> se){		    		
	    		marca.getStore().filter("descripcion", marca.getRawValue());
	    	}
	    });
	    
	     
	    ModeloPrendas.getComboColoresMP();
		ModeloPrendas.loaderColor.load();
		
	    color = new ComboBox<BeanModel>();
	    color.setDisplayField("descripcion");
	    color.setStore(ModeloPrendas.storeColor);
	    color.setTypeAhead(true);  
	    color.setEmptyText("Seleccione...");
	    color.setTriggerAction(TriggerAction.ALL);
	    color.setValueField("descripcion");
	    color.setUseQueryCache(false);
	    color.setAllowBlank(true);
	    //color.setValue(color.getStore().getAt(0));
	    color.setMinChars(0);
	    color.getStore().addStoreListener(new StoreListener<BeanModel>(){
	    	public void storeDataChanged(StoreEvent<BeanModel> se){
	    	    color.getStore().filter("descripcion",color.getRawValue());
	    	}
	    });

        
	    ModeloPrendas.getComboDiseniosMP();
		ModeloPrendas.loaderDisenio.load();
		
	    disenio = new ComboBox<BeanModel>();
	    disenio.setDisplayField("descripcion");
	    disenio.setStore(ModeloPrendas.storeDisenio);
	    disenio.setTypeAhead(true);  
	    disenio.setEmptyText("Seleccione...");
	    disenio.setTriggerAction(TriggerAction.ALL);
	    disenio.setValueField("descripcion");
	    disenio.setUseQueryCache(false);
	    disenio.setAllowBlank(true);
	    //disenio.setValue(disenio.getStore().getAt(0));
	    disenio.setMinChars(0);
	    disenio.getStore().addStoreListener(new StoreListener<BeanModel>(){
	    	public void storeDataChanged(StoreEvent<BeanModel> se){		    		
	    		disenio.getStore().filter("descripcion", disenio.getRawValue());
	    	}
	    });
	    
	    
	    ModeloPrendas.getComboTallasMP();
		ModeloPrendas.loaderTalla.load();
		
	    talla = new ComboBox<BeanModel>();
	    talla.setDisplayField("descripcion");
	    talla.setStore(ModeloPrendas.storeTalla);
	    talla.setTypeAhead(true);  
	    talla.setEmptyText("Seleccione...");
	    talla.setTriggerAction(TriggerAction.ALL);
	    talla.setValueField("descripcion");
	    talla.setUseQueryCache(false);
	    talla.setAllowBlank(true);
	    //talla.setValue(talla.getStore().getAt(0));
	    talla.setMinChars(0);
	    
	    talla.getStore().addStoreListener(new StoreListener<BeanModel>(){
	    	public void storeDataChanged(StoreEvent<BeanModel> se){
	    		talla.getStore().filter("descripcion",talla.getRawValue());
	    	}
	    });
	    

	    ModeloPrendas.getComboTelasMP();
		ModeloPrendas.loaderTela.load();
		
	    tela = new ComboBox<BeanModel>();
	    tela.setDisplayField("descripcion");
	    tela.setStore(ModeloPrendas.storeTela);
	    tela.setEmptyText("Seleccione...");
	    tela.setTypeAhead(true);  
	    tela.setTriggerAction(TriggerAction.ALL);
	    tela.setValueField("descripcion");
	    tela.setUseQueryCache(false);
	    tela.setAllowBlank(true);
	    tela.setValue(tela.getStore().getAt(0));
	    tela.setMinChars(0);
	    tela.getStore().addStoreListener(new StoreListener<BeanModel>(){
	    	public void storeDataChanged(StoreEvent<BeanModel> se){		    		
	    		tela.getStore().filter("descripcion", tela.getRawValue());
	    	}
	    });

        
	    ModeloPrendas.getComboTipoPrendasMP();			
		ModeloPrendas.loaderTipoPrenda.load();
		
	    tipoprenda = new ComboBox<BeanModel>();
	    tipoprenda.setDisplayField("nombre");
	    tipoprenda.setStore(ModeloPrendas.storeTipoPrenda);
	    tipoprenda.setTypeAhead(true);  
	    tipoprenda.setEmptyText("Seleccione...");
	    tipoprenda.setTriggerAction(TriggerAction.ALL);
	    tipoprenda.setValueField("nombre");
	    tipoprenda.setUseQueryCache(false);
	    tipoprenda.setAllowBlank(true);
	    tipoprenda.setValue(tipoprenda.getStore().getAt(0));
	    tipoprenda.setMinChars(0);
	    tipoprenda.getStore().addStoreListener(new StoreListener<BeanModel>(){
	    	public void storeDataChanged(StoreEvent<BeanModel> se){		    		
	    		tipoprenda.getStore().filter("nombre", tipoprenda.getRawValue());
	    	}
	    });
	
	    ModeloPrendas.getComboModeloPrendas();
	    modeloprenda = new ComboBox<BeanModel>();
	    modeloprenda.setEditable(false);
	    modeloprenda.setDisplayField("nombre");
	    modeloprenda.setStore(ModeloPrendas.storeModeloPrenda);
	    modeloprenda.setTypeAhead(true);
	    modeloprenda.setEmptyText("Seleccione...");
	    modeloprenda.setTriggerAction(TriggerAction.ALL);
	    modeloprenda.setValueField("nombre");
	    modeloprenda.setUseQueryCache(false);
	    modeloprenda.setAllowBlank(true);
	    modeloprenda.setValue(modeloprenda.getStore().getAt(0));

	    
	    codigo.setFieldLabel(constants.modeloPrendaCodigo());
	    tipoprenda.setFieldLabel(constants.TipoPrenda());
	    modeloprenda.setFieldLabel(constants.modeloPrendaNombre());
	    marca.setFieldLabel(constants.marcaNombre());
	    color.setFieldLabel(constants.colorNombre());
	    tela.setFieldLabel(constants.telaNombre());
	    disenio.setFieldLabel(constants.disenioNombre());
	    talla.setFieldLabel(constants.tallaNombre());

	    
	    left.add(codigo,formData);
	    cent1.add(tipoprenda,formData);
       // cent1.add(modeloprenda,formData);
        cent1.add(marca,formData);
        cent2.add(disenio,formData);
	    cent2.add(tela,formData);
	    right.add(color,formData);    
	    right.add(talla,formData);

	    
	    main.add(left, new ColumnData(.25));  
	    main.add(cent1, new ColumnData(.25));  
	    main.add(cent2, new ColumnData(.25));  
		main.add(right, new ColumnData(.25));  
	  
	    detalleFilter.add(main, new FormData("100%"));  
	    
	    add(detalleFilter,northData);	
	    
        
        BorderLayoutData southData = new BorderLayoutData(LayoutRegion.SOUTH);  
        southData.setMargins(new Margins(2));
        
        chart.setBorders(true);
                
        ChartModel model = new ChartModel(constants.graficosDetallePrendasVendidas(), "font-size: 14px; font-family: Verdana; text-align: center;");  
        model.setBackgroundColour("#fefefe");
        model.setLegend(new Legend(Position.TOP, true));  
        model.setScaleProvider(ScaleProvider.ROUNDED_NEAREST_SCALE_PROVIDER); 
        
        BarChart bar = new BarChart(BarStyle.GLASS);  
        
        bar.setColour("#0000cc");
        
        BarDataProvider barProvider = new BarDataProvider("cantidad", "codigo");
        
        Graficos.getGDetallePrendasVendidasxFecha();
        
        barProvider.bind(Graficos.storeGDetallePrendasVendidasFecha);  
        bar.setDataProvider(barProvider);
        model.addChartConfig(bar);
       
        chart.setChartModel(model);
        
        ChartListener listener = new ChartListener() { 
        	public void chartClick(ChartEvent ce) {  
        		int row = ce.getChartConfig().getValues().indexOf(ce.getDataType()); 
        		GridSelectionModel<BeanModel> sm = detalle.getSelectionModel();
        		sm.select(row, true);
        	}
        };
        bar.addChartListener(listener);
        
        add(chart, southData);
        
        BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER, 150);  
        centerData.setSplit(true);
       
        centerData.setFloatable(true);  
        centerData.setMargins(new Margins(0, 0, 0, 0));
        
        RowNumberer r = new RowNumberer();
        
        List<ColumnConfig> columns = new ArrayList<ColumnConfig>();        
        columns.add(r);
        
        columns.add(new ColumnConfig("codigo", constants.ventaCodigoPrenda(), 90));
        columns.add(new ColumnConfig("tipoprenda", constants.TipoPrenda(), 90));		
        columns.add(new ColumnConfig("marca", constants.marcaNombre(), 90));		
    	columns.add(new ColumnConfig("color", constants.colorNombre(), 90));		
    	columns.add(new ColumnConfig("disenio", constants.disenioNombre(), 90));		
    	columns.add(new ColumnConfig("tela", constants.telaNombre(), 90));		
    		
		ColumnConfig column = new ColumnConfig("talla", constants.tallaNombre(), 90);
        column.setAlignment(HorizontalAlignment.RIGHT);        
        columns.add(column);
        
        ColumnModel cm = new ColumnModel(columns);
        
        
        detalle = new Grid<BeanModel>(Graficos.storeGDetallePrendasVendidasFecha, cm);
        detalle.addPlugin(r);
        GridSelectionModel<BeanModel> sm = new GridSelectionModel<BeanModel>();
        sm.setSelectionMode(SelectionMode.SINGLE);
        detalle.setSelectionModel(sm);
        
        detalle.setLoadMask(true);  
        detalle.setBorders(true);
        
        add(detalle, centerData);
        
     //   buscar();
        
	}
	
	private boolean validate() {
		boolean des = desde.isValid();
		boolean has = hasta.isValid();
		boolean tien = tienda.isValid();
		
		return des && has && tien;
	}
	
	private void buscar(){
		status.show();
		find.hide();
		Graficos.fechainicial = desde.getValue();
		Graficos.fechafinal = hasta.getValue();
			
		if(tienda.getValue()!= null){
			Graficos.tienda_id     = Integer.parseInt(tienda.getValue().get("id").toString());
		    Graficos.codigo        = codigo.getValue();
		    Graficos.tipoprenda_id = (Integer)tipoprenda.getValue().get("id");
	 	    Graficos.marca_id      = (Integer)marca.getValue().get("id") ;
		    Graficos.tela_id       = (Integer)tela.getValue().get("id") ;
		    Graficos.disenio_id    = (Integer)disenio.getValue().get("id");
		    Graficos.color_id      = (Integer)color.getValue().get("id");
		    Graficos.talla_id      = (Integer)talla.getValue().get("id");
		  
		    //Graficos.cantidad   = ;
		}else
			Graficos.tienda_id = null;
		Graficos.GdpvFecha = singleton;
		Graficos.loaderGDetallePrendasVendidasFecha.load();	
	}
	
	public void setPermisos(List<String> permisos){
		boolean todas = permisos.contains("lastiendas");
		boolean su = permisos.contains("sutienda");
		
		if(todas){
			tiendaL.setVisible(true);
			tienda.setEnabled(true);
		    tienda.setVisible(true);		    
		}else if(su){
			tiendaL.setVisible(false);
			tienda.setEnabled(false);
		    tienda.setVisible(false);
		}
	}

}
